# GF_PY3_EXAMPLE_Open_WebUI_Pipelines_追加语气要求.py
# Create by GF 2025-04-08 12:12

# title: Formal Academic Tone Filter
# author: Gou Feng
# date: 2024-06-01
# version: 1.0
# license: MIT
# description: 在每条用户消息末尾追加正式学术语气要求的过滤器
# requirements: requests

from typing import List, Optional
from pydantic import BaseModel
from schemas import OpenAIChatMessage

class Pipeline:
    ############################################
    # 配置类 - 定义过滤器的连接目标和优先级
    ############################################
    class Valves(BaseModel):
        # 作用目标管道（默认作用于 llama3:latest 模型）
        # 格式说明: ["*"] 表示作用于所有模型, ["model1", "model2"] 指定特定模型
        pipelines: List[str] = ["qwen2.5-coder:7b"]
        
        # 执行优先级（数值越小越先执行）
        priority: int = 0

    def __init__(self):
        ############################################
        # 初始化过滤器属性
        ############################################
        self.type = "filter"              # 声明为过滤器类型
        self.name = "正式学术语气过滤器"  # 中文展示名称
        self.valves = self.Valves()       # 加载配置参数

    ############################################
    # 生命周期钩子函数
    ############################################
    async def on_startup(self):
        """服务器启动时触发 (可初始化资源)"""
        print(f"[{self.name}] 过滤器启动")

    async def on_shutdown(self):
        """服务器关闭时触发 (可清理资源)"""
        print(f"[{self.name}] 过滤器关闭")

    ############################################
    # 核心处理逻辑
    ############################################
    async def inlet(self, body: dict, user: Optional[dict] = None) -> dict:
        """
        处理请求数据的主入口
        :param body: 包含消息列表的请求体 (格式: {"messages": [...]})
        :param user: 用户信息 (可选)
        :return: 修改后的请求体
        """
        # 遍历所有消息 (原始数据格式为字典列表)
        for message in body.get("messages", []):
            # 仅处理用户消息 (role == "user")
            if message.get("role") == "user":
                # 在现有内容后追加语气要求 (保留原始内容)
                original_content = message.get("content", "")
                modified_content = f"{original_content} 请用正式学术语气回答。"
                message["content"] = modified_content
                
                # 调试日志 (实际使用可注释掉)
                print(f"[{self.name}] 已修改用户消息: {modified_content[:50]}...")
        
        # 返回修改后的完整请求体
        return body

# EOF Signed by GF.
